import type { Module } from 'vuex'
import type { RootState } from '@/store/types'
import { account, LoginAccountData } from '@/api/login/login'
import { MmLocalStorage } from '@/utils/storage'

export interface LoginModuleState {
  token: string
}

const loginModule: Module<LoginModuleState, RootState> = {
  namespaced: true,
  state: () => {
    return {
      token: MmLocalStorage.get('token') ?? ''
    }
  },
  getters: {},
  mutations: {
    changeToken(state, payload) {
      state.token = payload
    }
  },
  actions: {
    // 账号登录
    async accountLogin({ commit }, payload: LoginAccountData) {
      // 请求登陆
      // 这个await为了正确的返回结果
      await account(payload)
        .then((res) => {
          // 保存token
          const { token } = res.data
          commit('changeToken', token)
          MmLocalStorage.set('token', token)
        })
        .catch((error) => {
          // 登录失败
          return Promise.reject(error)
        })

      // 登录成功
      // 返回跳转路径，在登录按钮的功能中实现跳转
      return Promise.resolve('/')
    },
    // 退出登录
    logout({ commit }) {
      // 移除保存的token
      commit('changeToken', '')
      MmLocalStorage.remove('token')

      // 退出成功
      // 返回跳转路径，在调用处实现跳转
      return Promise.resolve('/login')
    }
  }
}

export default loginModule
